#ifndef _frontend_h

#define _frontend_h

#define MAXLONG 20

/*
	   retorna: una estructura con las opciones de juego ingresadas.
	   - le pide al usuario los parametros correspondientes 
	   para inicializar un juego nuevo
*/
opcJN pedir_opJN(void);

/*
	  retorna: un entero que representa la cantidad de filas
	  - le pide al usuario la cantidad de filas para 
	  armar el tablero y la valida.
*/
int pedirfil(void);

/*
	  retorna: un entero que representa la cantidad de columnas
	  - le pide al usuario la cantidad de columnas para 
	  armar el tablero y la valida.
*/
int pedircol(void);

/*
	  retorna: un entero que representa la cantidad de colores para el juego
	  - le pide al usuario la cantidad de colores con los que
	  desea jugar.
*/
int pedircolores(void);

/*
	  recibe: un entero que representa el maximo de fichas
	  retorna: un entero que representa la cantidad de fichas que hay
	  inicialmente en el tablero.
	  - le pide al usuario que ingrese la cantidad de fichas iniciales
*/
int pedircantfichas(int maxfic);

/*
	   recibe: un entero que representa el maximo de bolillas
	   para alinear (minimo entre dimension filas y columnas)
	   retorna: un entero que representa la cantidad de bolillas
	   para formar una linea
	  - le pide al usuario que ingrese la cantidad de bolillas para 
	  formar una linea
*/
int pediralinea(int maxlinea);

/*
	  retorna: un entero que representa la cantidad de bolillas que se
	  agregan por turno.
	  - le pide al usuario que ingrese la cantidad de bolillas que se
	  agregan por turno.
*/
int pedircantagrega(void);

/*
	  recibe: un entero que representa el puntaje acumulado a lo largo 
	  del juego
	  - le avisa el usuario que termino el juego.
*/
void findejuego(int);

/*
	  retorna: un entero que representa la opcion elegida
	  - imprime el menu en pantalla y espera que el usuario
	  ingrese una opcion y la valida.
*/
int menu(void);

/*
	  recibe: una estructura que representa el tablero en juego,
	  un string que representa el nombre de un archivo,
	  dos estructuras que representa una coordenada,
	  un entero que representa el jugador(1,2) que esta jugando 
	  en ese momento
	  retorna: el numero de comando que fue ingresado
	  - valida el comando que fue ingresado por el usuario:
	  de ser valido lo guarda y retorna el comando ingresado
	  si es invalido imprime un msje de error y retorna ERROR
	  
*/
int validarcomando(tablero tab, char * filename, coordenada * pto, coordenada * pto1, int jugador);

/*
	  recibe: un string donde guarda el comando ingresado
	  un entero que representa el jugador que este jugando
	  - le pide al usuario que ingrese un comando y lo
	  guarda en el string
*/
void pedircomando(char * comando, int jugador);

/*
	  recibe: un entero que representa el nro de error
	  - imprime el error en pantalla
*/
void error(int num);

/*
	  retorna: una estructura que representa el tiempo de juego
	  - le pide al usuario que ingrese el tiempo de juego
*/
tipotiempo pedirtiempo(void);

/*
	  recibe: un entero que representa la cantidad de filas
	  otro que representa la cant de columnas
	  la matriz del tablero del jugador 1
	  la matriz del tablero del jugador 2
	  un entero con la modalidad de juego
	  - imprime en pantalla 1 o 2 matrices segun la modalidad
	  de juego
*/
void imprimir_matriz(int fil,int col, char** mat1,char** mat2,int modalidad);

/*
	  recibe: una puntero a la estructura para inicializar el tablero del jugador 1,
	  una puntero a la estructura para inicializar el tablero del jugador 2,
	  una puntero a la estructura para inicializar el tiempo de total de juego,
	  un entero con la modalidad de juego
	  retorna: 1 si se puede, 0 sino
	  - Inicializa un juego nuevo, genera las matrices necesarias y las inicializa.  
*/
int juegoNuevo(tablero * tab1, tablero * tab2, tipotiempo * tiempo, int modalidad);

/*
	  recibe: una puntero a la estructura del tablero,
	  dos estructuras con las coordenadas de los puntos 
	  que deseo mover (de pto a pto1)
	  retorna: 0 si el movimiento es valido, 1 sino
	  - si fija si las coordenadas son validas y si existe un camino 
	  que permita el movimiento. de ser asi lo ejecuta. Sino imprime
	  en pantalla un mensaje de error.
*/
int ejecutarMov(tablero * tab, coordenada pto, coordenada pto1);
/*
	  recibe: un entero que representa el comando que quiero ejecutar,
	  dos estructuras que representan dos puntos del tablero,
	  un string con el nombre del archivo,
	  una puntero a la estructura del tablero en juego,
	  una matriz con el tablero de la jugada anterior,
	  un puntero a entero que representa el puntaje,
	  un puntero a entero que reprenseta el flag de undo,
	  un entero con la modalidad de juego
	  retorna: 1 si el comando se puede ejecutar, 0 sino y 
	  -1 si el juego termino
	  - se fija que comando le llego, y en base a eso intenta ejecutarlo.
	  si no puede imprime mensaje de error.
*/
	int ejecutarComando(int comando, coordenada pto, coordenada pto1, char filename[MAXLONG], tablero * juegoAct, char ** juegoAnt, int * puntaje, int *puntajeAnt, int *flagundo , int modalidad, int jug1, int tiempoRest, int puntaje1, char **mat );
/*
*/
void pedirnombre(char filename[MAXLONG]);		   

#endif